package main

import "fmt"

// 为什么要使用interface

type cat struct {
}

func (c cat) say() {
	fmt.Println("cat 喵喵喵~ ")
}

type dog struct {
}

func (d dog) say() {
	fmt.Println("dog 汪汪汪~")
}

type person struct {
	name string
}

func (p person) say() {
	fmt.Printf("%s  啊啊啊~", p.name)
}

// 接口不管你是什么类型，它只在乎你是不是有方法
// 多个类型也可以实现一个接口

type sayer interface {
	say()
}

func beat(arg sayer) {
	arg.say()
}

func main() {
	c1 := cat{}
	beat(c1)
	d1 := dog{}
	beat(d1)
	p1 := person{name: "name"}
	beat(p1)
	fmt.Println(">>>>======<<<<")
	// 创建了接口之后，所有的符合条件的变量都可以存储到接口变量中
	var s sayer
	c2 := cat{}
	s = c2

	fmt.Println(s)
	p2 := person{"dd"}
	s = p2
	fmt.Println(s)

}
